<?php

class ImageStorage
{
	var $max_size = 200; // максимальный размер для всех разрешений для тумбнейла в пикселах, дефолтное

	public function __construct ($store)
	{
		$this->store = $store;

		$this->thumbs = array( // в этом массиве если одно из разрешений не задано, то по нему нет ограничений
			'orig'=>array(
				'filter'=>'pass',
				'clone' =>false,
			),
			"sm1"=>array(
				"w"=>220,
			),
			"sm2"=>array(
				"w"=>460,
			),
			"gal"=>array(
				"w"=>100,
				"h"=>100,
			),
			"wdg"=>array(
				"w"=>53,
				"h"=>53,
			),
		);

	} // end of __construct

	public function Get( $image_oid )
	{
		// вернет массив с метаинформацией про все что необходимо для вывода картинки
		if (is_numeric($image_oid) && $image_oid > 0) {
			$query['imagestorage']['oid']['=='] = $image_oid;
			$find_result = $this->store->find( $query );
			$image_meta = $find_result->next();

			return $image_meta->data;
		} else return false;

	}
	public function Del( $image_oid )
	{
		$query['imagestorage']['oid']['=='] = $image_oid;
		$find_result = $this->store->find( $query );
		$image_meta = $find_result->next();

		if ($image_meta) {
			// удаляем файлы
			unlink($image_meta->data['path_to_orig']);
			// --- thumbs --- {{{
			foreach ($this->thumbs as $name=>$thumb) {
				unlink($image_meta->data['path_to_'.$name]);
			}
			// --- thumbs --- }}}

			// и объект
			$image_meta->delete('imagestorage');
		}
	}
	public function Put ($path_to_img, $thumbs=NULL)
	/**
	 * Сохранит картинку, тумбы и метаинформацию в store, вернет oid сохраненного.
	 *
	 * Основная идея - описать одно изображение во всех его мыслимых разрешениях одной записью в бд
	 * Следует заметить что нас тут совершенно не волнует имя файла
	 *
	 * @param mixed $path_to_img путь к исходному файлу с картинкой
	 * @param mixed $thumbs конфиг тумбов картинки array(
	 *                      'slot_name' => array('filter' =>, 'w' => , 'h' => ),
	 *                      );
	 * @access public
	 * @return oid
	 */
	{
		require_once 'thumb/thumb.php';

		$image_data = array();

		$thumb_engine = new Thumb();
		try {
			// 1. проверим файл ли это и существует ли он
			$src_im = $thumb_engine->imageFromFile($path_to_img);
		} catch (Exception $e) {
			return false;
		}

		// 2. создаем уменьшенные копии и тоже кладем их в хранилище
		// определим тип картинки потом создаем из файла ресурс и делаем ресамплинг, затем сохраняем в файл
		$gis = @getimagesize($path_to_img);
		if (empty($gis)) { 
			// это не файл или не картинка
			// с этим работать не умеем
			return false; 
		}

		list($width, $height, $image_type, $img_string) = $gis;
		$mime_type = $gis['mime'];

		$image_data[   "mime_type"] = $mime_type;

		// --- process thumbs && orig --- {{{

		if (!isset($thumbs)) $thumbs = $this->thumbs;
		// оригинал тоже пропускаем через фильр. и сохраняем его в БД аналогично тумбам под именем 'orig'
		if (!isset($thumbs['orig'])) $thumbs['orig'] = array('filter' => 'pass', 'clone' => false);

		// побежали добавлять тумбы
		foreach ($thumbs as $name=>$thumb) {
			$thumb['type'] = $src_im->type;

			# COMPATIBILITY HACK : 2007-11-28 : lucky
			# если фильтр не указан, используем 'smart'
			# (вообще filter, указывать обязательно, иначе за результат не отвечаем =) )
			if (!isset($thumb['filter'])) $thumb['filter'] = 'smart';
			#/

			$dst_im = $thumb_engine->convert($src_im, $thumb);

			// создаем файл
			$thumb_file = $this->store->addFile();

			// сохранить
			$thumb_engine->imageToFile($dst_im, $thumb_file);

			$image_data[ 'path_to_'.$name] = $thumb_file;
			$image_data[  $name.'_size_x'] = $dst_im->getWidth();
			$image_data[  $name.'_size_y'] = $dst_im->getHeight();

			# FIXME : 2008-04-29 : lucky
			# иногда $dst_im = $thumb_engine->convert($src_im, ..) 
			# возвращает $dst_im->handle с тем же значением, что содержится в $src_im->handle . 
			# т.е. он не копирует картинку "физически". но это значит, что мы не можем безопасно сказать 
			# $dst_im->free(), т.к. это может очистить ресурс $src_im->handle;
			#
			if ($src_im->handle !== $dst_im->handle) {
				$dst_im->free();
			}
			#/
		}
		$dst_im->free();
		$src_im->free();
		unset($src_im, $dst_im);

		// --- thumbs && orig --- }}}

		// 3. создаем объект в бд
		$image_object = $this->store->create("fimagestorage", $image_data);

		$image_object->save();
		$image_object->inSense("imagestorage");

		/*
		header("Content-type: image/jpeg");
		imagejpeg( $dst_im->handle );
		*/
		//return 4;
		return $image_object->id;

	}
}

